import { useAuthStore } from '../stores/auth'

// 路由守卫配置
export function setupRouteGuards(router) {
  console.log('初始化路由守卫配置');
  console.log('当前路由模式:', router.options.history.constructor.name);
  
  // 防止循环重定向的标记
  let isProcessingAuth = false;
  // 上次认证检查的页面和时间
  let lastCheckedPath = '';
  let lastCheckedTime = 0;

  // 增强的路由守卫实现
  router.beforeEach(async (to, from, next) => {
    console.log(`--- 导航开始: 从 ${from.fullPath} 到 ${to.fullPath} ---`);
    
    // 如果当前正在处理认证，或者刚刚检查过同一路由（500ms内），直接通过
    const now = Date.now();
    if (isProcessingAuth && to.path === lastCheckedPath && now - lastCheckedTime < 500) {
      console.log(`[守卫] 跳过重复的认证检查，允许导航到 ${to.path}`);
      return next();
    }
    
    // 设置认证处理标记
    isProcessingAuth = true;
    lastCheckedPath = to.path;
    lastCheckedTime = now;
    
    try {
      // 检查页面是否需要认证
      const requiresAuth = to.matched.some(record => record.meta.requiresAuth);
      console.log(`[守卫] 路径 ${to.path} 是否需要认证: ${requiresAuth}`);
      
      // 获取当前登录状态（直接从localStorage）
      const hasToken = !!localStorage.getItem('admin_token');
      console.log(`[守卫] 当前本地Token状态: ${hasToken ? '存在' : '不存在'}`);
      
      // 1. 路由到登录页的情况
      if (to.name === 'login') {
        // 如果已登录，重定向到首页
        if (hasToken) {
          console.log('[守卫] 已登录状态下访问登录页，重定向到首页');
          isProcessingAuth = false;
          return next({ name: 'dashboard', replace: true });  // 使用replace以避免导航历史累积
        } else {
          // 未登录，正常访问登录页
          console.log('[守卫] 正常访问登录页');
          isProcessingAuth = false;
          return next();
        }
      }
      
      // 2. 路由到需要认证的页面
      if (requiresAuth) {
        if (!hasToken) {
          // 无token，需要认证的页面重定向到登录
          console.log(`[守卫] 需要认证但未登录，重定向到登录页`);
          isProcessingAuth = false;
          return next({ 
            name: 'login', 
            query: { redirect: to.fullPath }, 
            replace: true  // 使用replace以避免导航历史累积
          });
        } else {
          // 有token，调用认证状态检查并等待结果
          const authStore = useAuthStore();
          // 确保认证状态已完全初始化
          await authStore.checkAndRefreshAuth();
          
          if (!authStore.isLoggedIn) {
            // Token无效或已过期
            console.log(`[守卫] Token无效或已过期，重定向到登录页`);
            isProcessingAuth = false;
            return next({ 
              name: 'login', 
              query: { redirect: to.fullPath },
              replace: true
            });
          }
          
          // 检查权限
          const requiredPermission = to.meta.permission;
          
          // 如果指定了权限要求，检查用户是否有权限
          if (requiredPermission && !authStore.hasPermission(requiredPermission)) {
            console.log(`[守卫] 无权限访问 ${to.path}，重定向到首页`);
            isProcessingAuth = false;
            return next({ name: 'dashboard', replace: true });
          } else {
            // 有权限，正常访问
            console.log(`[守卫] 已登录且有权限，允许访问 ${to.path}`);
            isProcessingAuth = false;
            return next();
          }
        }
      }
      
      // 3. 不需要认证的页面，直接访问
      console.log(`[守卫] 不需要认证的页面，直接访问 ${to.path}`);
      isProcessingAuth = false;
      return next();
    } catch (error) {
      // 错误处理
      console.error('[守卫] 认证过程发生错误:', error);
      isProcessingAuth = false;
      
      // 错误时默认允许导航继续，避免用户被卡住
      return next();
    }
  });

  router.afterEach((to, from) => {
    console.log(`--- 导航完成: 从 ${from.fullPath} 到 ${to.fullPath}, 当前URL: ${window.location.href} ---`);
    // 更新页面标题
    if (to.meta.title) {
      document.title = to.meta.title + ' - 营养师后台管理系统';
    }
  });

  router.onError(error => {
    console.error('路由错误:', error);
  });
}